package test.algorithm.FastSlowPointer;

/**
 * 快速排序
 * @author serenity
 *
 */
public class QuickSort {
	
	/**
	 * 元素交换
	 * @param k
	 * @param low
	 * @param high
	 */
	public static void swap(int k[], int low, int high)
	{
		int temp;

		temp = k[low];
		k[low] = k[high];
		k[high] = temp;
	}
	
	/**
	 * 划分
	 * @param list
	 * @param low
	 * @param high
	 * @return
	 */
	public static int partition(int[] list,int low,int high){
		 
		//数组的第一个作为中值
		int point = list[low];
		
		while(low < high){
			
			//从高位遍历，获取比中值小的下标（high）
			while(low<high && list[high]>=point){
				high--;
			}
			
			//比中值小的记录移到低端
			list[low] = list[high];   
			
			//从低位遍历，获取比中值大的下标 （low）
			while(low<high && list[low]<=point){
				low++;
			}
			
			//比中值大的记录移到高端
			list[high] = list[low];   
		}
		
		// low和hight相等，这就是point在整个排序中的位置
		// 低端的都比 point小，高端的都比point大
		list[low] = point;              
		  
        return low; 
	}
	
	/**
	 * 快速排序
	 * @param list
	 * @param low
	 * @param high
	 */
	public static void QSort(int[] list, int low, int high){
		
		int point = 0;
		if(low < high){
			//将list数组进行一分为二
			point = partition(list,low,high);
			
			//对低位序列进行递归排序
			QSort(list,low,point-1);
			//对高位序列进行递归排序
			QSort(list,point+1,high);
		}
		
	}
	
	/**
	 * 快速排序
	 * @param list
	 */
	public static void quickSort(int[] list){
		QSort(list,0,list.length-1);
	}

	public static void main(String[] args) {
		int[] list = {4, 2, 5, 0, 3, 9, 1, 7, 6, 8};

		quickSort(list);
		
		System.out.print("打印数组：");
		for(int i :list){
			System.out.print(i+" ");
		}
	}

}
